#ifndef TTY_H
#define TTY_H

#include "ipc/sem.h"

#define TTY_NR                  8
#define TTY_OBUF_SIZE           512
#define TTY_IBUF_SIZE           512

#define TTY_CMD_ECHO            0x1         // 是否打开TTY回显
#define TTY_CMD_IN_COUNT            0x2         // 获取输入缓冲区中已有的数据量

#define TTY_OCRLF               (1 << 0)    // 把换行转化为回车换行
#define TTY_INCLR               (1 << 0)    // 输入换行也要进行转换
#define TTY_IECHO               (1 << 1)    // 输入的内容是否要回显到显示器上（如：输入密码的时候不需要显示在屏幕上）


typedef struct _tty_fifo_t {
    char *buf;
    int size;                   // buf数组的大小
    int read, write;            // buf读写指针索引值
    int count;                  // buf中的数据有多少个
} tty_fifo_t;

typedef struct _tty_t {
    char obuf[TTY_OBUF_SIZE];
    tty_fifo_t ofifo;
    sem_t osem;
    char ibuf[TTY_IBUF_SIZE];
    tty_fifo_t ififo;
    sem_t isem;

    int oflags;
    int iflags;
    int console_idx;            // 把tty设备关联到某一个控制台
} tty_t;


int tty_fifo_put(tty_fifo_t *fifo, char c);
int tty_fifo_get(tty_fifo_t *fifo, char *c);

void tty_in(char ch);      // idx表示从那个终端输入0～7
void tty_select(int tty);

#endif